/**
 * Copyright 厦门中软海晟信息技术有限公司 版权所有 违者必究 2019
 */
package com.vijos;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author : sunzb(sunzb@hsit.com.cn)
 * @date: 2019/4/22
 */
//隐形的翅膀
//天使告诉小杉，每只翅膀都有长度，两只翅膀的长度之比越接近黄金分割比例，就越完美。
//现在天使给了小杉N只翅膀，小杉想挑出一对最完美的。
//第一行有一个数N(2<=N<=30000)
//第二行有N个不超过1e5的正整数，表示N只翅膀的长度。
//    对每组测试数据输出两个整数，表示小杉挑选出来的一对翅膀。
//    注意，比较短的在前，如果有多对翅膀的完美程度一样，请输出最小的一对。
//    你可以认为黄金分割比就是0.6180339887498949
public class P9_3_1237 {

    public static int[] test(int[] in) {
        double goldenRate = 0.6180339887498949;
        Arrays.sort(in);
        List<Compute> computes = new ArrayList<>();
        for (int i = 0; i < in.length - 1; i++) {
            for (int j = i + 1; j < in.length; j++) {
                double rate = in[i] / in[j];
                computes.add(new Compute().setLow(in[i])
                    .setHigh(in[j]).setRate(rate).setRateDelta(Math.abs(rate - goldenRate)));
            }
        }
        Compute min = computes.get(0);
        for (int i = 1; i < computes.size(); i++) {
            Compute cur = computes.get(i);
            if (cur.rateDelta < min.rateDelta) {
                min = cur;
            } else if (cur.rateDelta == min.rateDelta) {
                if (cur.low < min.low) {
                    min = cur;
                }
            }
        }
        return new int[] {min.getLow(), min.getHigh()};
    }

    static class Compute {
        private double rate;
        private int low;
        private int high;
        private double rateDelta;

        public double getRate() {
            return rate;
        }

        public Compute setRate(double rate) {
            this.rate = rate;
            return this;
        }

        public double getRateDelta() {
            return rateDelta;
        }

        public Compute setRateDelta(double rateDelta) {
            this.rateDelta = rateDelta;
            return this;
        }

        public int getLow() {
            return low;
        }

        public Compute setLow(int low) {
            this.low = low;
            return this;
        }

        public int getHigh() {
            return high;
        }

        public Compute setHigh(int high) {
            this.high = high;
            return this;
        }
    }

    // 打印int数组
    public static void printArray(int[] values) {
        StringBuilder sb = new StringBuilder().append('[');
        for (int i = 0; i < values.length; i++) {
            if (i != values.length - 1) {
                sb.append(values[i]).append(", ");
            } else {
                sb.append(values[i]);
            }
        }
        sb.append(']');
        System.out.println(sb.toString());
    }

    public static void main(String[] args) {
        printArray(test(new int[] {2, 3, 4, 6}));
    }
}
